﻿function require(p) {
    var path = require.resolve(p);
    var mod = require.modules[path];
    /*避免重复加载*/
    if (!mod) {
        // 同步加载JS脚本
        $.ajax({
            url: path + '.js',
            dataType: "text",
            async: false,
            success: function (scr, status, xhr) {
                // 合成CommonJS导出模块的语法
                var srcCode = 'require.modules[\'' + path + '\'] = function(module, exports, require){\n' + scr + '\n}';
                eval(srcCode);
            },
            error: function (xhr, status, err) {
                // 异常处理
                throw new Error('脚本加载异常, 加载路径: ' + path + ' , 状态码: ' + xhr.status + ' , 错误描述 : ' + err);
            }
        });
    }

    mod = require.modules[path];
    if (!mod) throw new Error('failed to require "' + p + '"');
    if (!mod.exports) {
        mod.exports = {};
        // 模块内部的模块加载
        mod.call(mod.exports, mod, mod.exports, require.relative(path));
    }
    return mod.exports;
}

require.modules = {};

require.resolve = function (path) {
    var orig = path;
    var reg = path + '.js';
    var index = path + '/index.js';
    return require.modules[reg] && reg
      || require.modules[index] && index
      || orig;
};

// 相对加载模块，指所加载的文件内部的模块加载进入这个方法
require.relative = function (parent) {
    return function (p) {
        if ('.' != p.charAt(0)) return require(p);
        var path = parent.split('/');
        var segs = p.split('/');
        // 去掉路径中文件名，即数组最后一位
        path.pop();
        for (var i = 0; i < segs.length; i++) {
            var seg = segs[i];
            if ('..' == seg) {
                // ..表示上级目录，则相对父级目录parent的数组需要减去最后一位
                path.pop();
            }
            else if ('.' != seg) {
                // .表示当前目录，想对父级目录parent的加载模块
                path.push(seg);
            }
        }
        return require(path.join('/'));
    };
};

var exports = {};